/**
 * @param {character[][]} board
 * @return {boolean}
 */
var isValidSudoku = function (board) {
  // 初始化三个哈希表，分别记录行、列和3x3子宫中出现的数字
  const rows = new Array(9).fill().map(() => new Set());
  const cols = new Array(9).fill().map(() => new Set());
  const boxes = new Array(9).fill().map(() => new Set());

  // 遍历数独的每个单元格
  for (let i = 0; i < 9; i++) {
    for (let j = 0; j < 9; j++) {
      const num = board[i][j];

      // 跳过空白格
      if (num === ".") continue;

      // 计算当前单元格所属的3x3子宫索引
      const boxIndex = Math.floor(i / 3) * 3 + Math.floor(j / 3);

      // 检查当前数字是否在所在行、列或子宫中已出现
      if (rows[i].has(num) || cols[j].has(num) || boxes[boxIndex].has(num)) {
        return false;
      }

      // 将当前数字添加到对应的行、列和子宫集合中
      rows[i].add(num);
      cols[j].add(num);
      boxes[boxIndex].add(num);
    }
  }

  // 所有检查通过，数独有效
  return true;
};
